package main

import (
	"fmt"
	"net/http"

	"gitee.com/mysoft-free/queue/queue"
	"github.com/douglarek/zerodown"

	"github.com/gin-gonic/gin"
)

//catchSelfDefinedError : 捕获自定义错误
func catchSelfDefinedError() gin.HandlerFunc {

	return func(c *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				if e, ok := err.(*queue.QError); ok {
					c.JSON(http.StatusOK, e)
					c.Abort()
					return
				}
				panic(err)
			}

		}()
		c.Next()
	}

}

func main() {

	r := gin.Default()
	r.Use(catchSelfDefinedError()) //增加中间件
	//启动初始化工作
	dm := queue.NewDelayMessage()
	dm.Start()
	// //初始化多队列模型
	queues := new(queue.Queues)

	//创建队列
	r.POST("/queue/create", func(c *gin.Context) {
		var queue queue.Queue
		c.BindJSON(&queue)

		if err := queues.Create(queue); err != nil {
			panic(err)
		}

		c.JSON(http.StatusOK, gin.H{
			"status": "ok",
		})

	})

	//删除队列
	r.POST("/queue/delete", func(c *gin.Context) {
		var queue queue.Queue
		c.BindJSON(&queue)

		if err := queues.Delete(queue); err != nil {
			panic(err)
		}
		c.JSON(http.StatusOK, gin.H{
			"status": "ok",
		})
	})

	//投递队列
	r.POST("/message/put", func(c *gin.Context) {
		var message queue.Message
		c.BindJSON(&message)

		if err := message.Enqueue(dm, queues); err != nil {
			panic(err)
		}

		c.JSON(http.StatusOK, gin.H{
			"status": "ok",
		})
	})

	//取出队列数据
	r.GET("/message/get", func(c *gin.Context) {
		var qname = c.Query("queue_name")
		var message = new(queue.Message)
		var msg, err = message.DeQueue(qname, queues)

		if err != nil {
			panic(err)
		}

		c.JSON(http.StatusOK, gin.H{
			"status": "ok",
			"data":   msg,
		})
	})

	fmt.Println(zerodown.ListenAndServe(":9090", r))

}
